<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" >

<title>微服务相关思考(一) | 小克的blog</title>

<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">

<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous">
<link rel="shortcut icon" href="https://woodywrx.gitee.io/blog/favicon.ico?v=1615823433634">
<link rel="stylesheet" href="https://woodywrx.gitee.io/blog/styles/main.css">



<link rel="stylesheet" href="https://unpkg.com/aos@next/dist/aos.css" />
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>



    <meta name="description" content="声明
以下内容都是本人很片面的观点，如有错误，请帮忙纠正，非常感谢~

😢背景
随着咱们的服务越来越庞大，所编写的功能模块也越来越多，单体应用带来了以下问题：

1. 服务臃肿，一处细小改动往往需要重启所有业务服务；
2. 若某接口故障，..."/>
    <meta name="keywords" content="grpc"/>
</head>
<body>

<div id="app" class="main">

    <div class="sidebar" :class="{ 'full-height': menuVisible }">
  <div class="top-container" data-aos="fade-right">
    <div class="top-header-container">
      <a class="site-title-container" href="https://woodywrx.gitee.io/blog">
        <img src="https://woodywrx.gitee.io/blog/images/avatar.png?v=1615823433634" class="site-logo">
        <h1 class="site-title">小克的blog</h1>
      </a>
      <div class="menu-btn" @click="menuVisible = !menuVisible">
        <div class="line"></div>
      </div>
    </div>
    <div>
      
        
          <a href="https://woodywrx.gitee.io/blog" class="site-nav">
            首页
          </a>
        
      
        
          <a href="https://woodywrx.gitee.io/blog/tags" class="site-nav">
            标签
          </a>
        
      
        
          <a href="https://woodywrx.gitee.io/blog/post/about" class="site-nav">
            关于
          </a>
        
      
    </div>
  </div>
  <div class="bottom-container" data-aos="flip-up" data-aos-offset="0">
    <div class="social-container">
      
        
      
        
      
        
      
        
      
        
      
    </div>
    <div class="site-description">
      欢迎来到我的小窝~这里不仅有博客，也有日记。
    </div>
    <div class="site-footer">
      wuranxu's blog | <a class="rss" href="https://woodywrx.gitee.io/blog/atom.xml" target="_blank">RSS</a>
    </div>
  </div>
</div>


    <div class="main-container">
        <div class="content-container" data-aos="fade-up">
            <div class="post-detail">
                <h2 class="post-title">微服务相关思考(一)</h2>
                <div class="post-date">2020-09-23 18:59:41</div>
                
                <div class="post-content" v-pre>
                    <h3 id="声明">声明</h3>
<pre><code>以下内容都是本人很片面的观点，如有错误，请帮忙纠正，非常感谢~
</code></pre>
<h3 id="背景">😢背景</h3>
<pre><code>随着咱们的服务越来越庞大，所编写的功能模块也越来越多，单体应用带来了以下问题：

1. 服务臃肿，一处细小改动往往需要重启所有业务服务；
2. 若某接口故障，则导致所有接口均不可用，可用性低；
3. 业务耦合度过高，不利于业务的扩展，常常会导致牵一发动全身的情况出现；
4. 不适合快速迭代开发，往往开发周期被拖得很长。
</code></pre>
<h3 id="问题">问题</h3>
<pre><code>既然问题出现了，那我们就需要对症下药。试想，我们将服务进行拆分，不同的服务对应不同的业务。

之前的模式好比，10个人在吃一块巨大的蛋糕，服务拆分以后就好像把蛋糕切成10块，然后每个人吃自己那块就行了。

但是咱们的后台系统，可不是吃蛋糕那么简单。思考一下服务拆分后会带来哪些问题？

1. 虽然完成了解耦的工作，但是对于业务有关联性的时候，双方怎么进行交流呢？也就是服务之间如何通信呢？
2. 服务需要统一的入口，假如拆分3个服务，那么每个服务需要占用1个端口，对于前端来说，它怎么知道什么url对应什么服务的地址呢？如果每个服务部署到多台机器呢？

等等~
</code></pre>
<h3 id="思考">思考</h3>
<pre><code>针对第一个问题，其实可以采用http请求进行通信，比如我的获取用户信息隶属于==userService==, 那么我找到对应的域名（ip）就可以进行相关接口的调用，拿到对应的用户信息。

但是！这个方案有个缺点，就是: 我们知道http协议是无状态的，也就是说我1秒钟前请求了这个接口，下一秒他还是会重新建立网络连接，所有流程再进行一遍，这对于服务器资源来说，算是一笔不小的开销。
</code></pre>
<h3 id="grpc">grpc</h3>
<pre><code>那么我们就需要用rpc来取代http协议，市场上有多种框架: grpc, thrift, dubbo等等。
</code></pre>
<p>我们今天就着重说一下<a href="https://grpc.io">grpc</a></p>
<pre><code>gRPC  是一个高性能、开源和通用的 RPC 框架，面向移动和 HTTP/2 设计。目前提供 C、Java 和 Go 语言版本，分别是：grpc, grpc-java, grpc-go. 其中 C 版本支持 C, C++, Node.js, Python, Ruby, Objective-C, PHP 和 C# 支持.

gRPC 基于 HTTP/2 标准设计，带来诸如双向流、流控、头部压缩、单 TCP 连接上的多复用请求等特。这些特性使得其在移动设备上表现更好，更省电和节省空间占用。

简单的说呢，它对比HTTP协议，优势很大。

再来说一下它的缺点:

- 学习门槛较高
- 需要编写proto文件
- 生成的rpc服务是tcp的，未暴露http接口给前端使用
</code></pre>
<h3 id="网关">网关</h3>
<pre><code>其实网关这个东西，也可以不需要，nginx足够使用了。针对第二个问题，其实主要是想给客户端提供一个统一的入口。比如针对https://abc.com/user/*这个路由，将其指向对应的userService即可。而且nginx也有自带的负载均衡的策略，想到这里我不禁陷入了沉思，我得思考一下为什么需要go的网关了~

大概查阅了一下相关资料，可能因为自研网关对比nginx来说定制化更容易吧。
</code></pre>
<p>以下内容参考自 <a href="https://www.v2ex.com/t/684586">关于微服务网关的选择</a>:</p>
<pre><code>&quot;nginx 性能虽强，但功能有限。我们一般只用来做负载均衡和反向代理。后面还是 gateway 来实现做身份验证、鉴权、限流、接口访问日志等功能。&quot;
</code></pre>

                </div>
                
                    <div class="tag-container">
                        
                            <a href="https://woodywrx.gitee.io/blog/S8t-Fanls/" class="tag">
                                grpc
                            </a>
                        
                    </div>
                

                
                    <div class="next-post">
                        <div class="next">下一篇</div>
                        <a href="https://woodywrx.gitee.io/blog/post/react-hook/">
                            <h3 class="post-title">
                                react hook
                            </h3>
                        </a>
                    </div>
                
                
                    <span id="/blog/post/wei-fu-wu-xiang-guan-si-kao-yi/"
                          class="leancloud_visitors" data-flag-title="微服务相关思考(一)">
                <em class="post-meta-item-text">阅读量 </em>
                <i class="leancloud-visitors-count">0</i>
            </span>
                
                
                    

	<div id="vcomments" style="width: 100%;max-width:1000%;padding:2.5%"></div>



                

            </div>

        </div>
    </div>
</div>

<script src="https://unpkg.com/aos@next/dist/aos.js"></script>
<script type="application/javascript">

AOS.init();

var app = new Vue({
  el: '#app',
  data: {
    menuVisible: false,
  },
})

</script>






<script src='https://cdn.jsdelivr.net/npm/valine/dist/Valine.min.js'></script>
<script>
    new Valine({
        el: '#vcomments',
        appId: 'fT8wvEVNtx1cOcCQEs7rVwnV-gzGzoHsz',
        appKey: 'xV6aDHKSkLfP7u0cBRIzpmcy',
        avatar: '',
        pageSize: 5,
        recordIp: true,
        placeholder: 'Just Go Go',
        visitor: true,
    });
</script>
<script async src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script>
</body>
</html>
